package personal.zq.practice.common.utils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;

/**
 *  分页工具类
 *
 * @author Vince Yuan
 * @date 09/02/2021
 */
@Slf4j
public class PageUtils {

    private PageUtils() {}

    /**
     *  对所有记录进行分页
     *
     * @param allRecords 需要分页的所有记录
     * @param currentPage 当前页
     * @param pageSize 页大小
     * @param <T> 泛型参数
     * @return 当前页的记录
     */
    public static <T> List<T> page(List<T> allRecords, Integer currentPage, Integer pageSize) {
        List<T> pageRecords = new ArrayList<>();
        if (CollectionUtils.isEmpty(allRecords)) {
            return pageRecords;
        }
        log.info("=== page | 分页开始 | 当前页: {} | 页面大小: {} ===", currentPage, pageSize);
        PageResult pageResult = PageUtils.startPage(currentPage, pageSize);
        int sizeOfAllRecords = allRecords.size();
        for (int i = pageResult.getStartRow(); i < pageResult.getEndRow(); i++) {
            if (i < sizeOfAllRecords) {
                pageRecords.add(allRecords.get(i));
            }
        }
        log.info("=== page | 分页结束 | 记录数: {} ===", pageRecords.size());
        return pageRecords;
    }

    /**
     *  计算分页结果
     *
     * @param currentPage
     * @param pageSize
     * @return
     */
    private static PageResult startPage(Integer currentPage, Integer pageSize) {
        // 计算分页结果
        currentPage = currentPage <= 0 ? 1 : currentPage;
        int startRow = currentPage > 0 ? (currentPage - 1) * pageSize : 0;
        int endRow = startRow + pageSize * (currentPage > 0 ? 1 : 0);
        // 返回分页结果
        PageResult pageResult = new PageResult();
        pageResult.setStartRow(startRow);
        pageResult.setEndRow(endRow);
        return pageResult;
    }

    @Data
    static class PageResult implements Serializable {

        private static final long serialVersionUID = -2209490055050331169L;
        /**
         *  起始行（包含）
         */
        int startRow;

        /**
         *  结束行（除外）
         */
        int endRow;
    }
}
